import pandas as pd
import datetime
import math
workdays = [0, 1, 2, 3, 4]
def 获取最近工作日(N):
    # 定义工作日列表，这里假设周六周日为非工作日

    # 获取当前日期
    today = datetime.date.today()
    today=today + datetime.timedelta(days=N)
    # print(today)
    # 如果今天是工作日，则下一个工作日就是明天或后天
    if today.weekday() in workdays:
        last_workday = today + datetime.timedelta(days=1)
        if last_workday.weekday() not in workdays:
            last_workday += datetime.timedelta(days=1)
    else:
        # 如果今天是非工作日，则下一个工作日就是下一个工作日
        last_workday = today + datetime.timedelta(days=1)
        while last_workday.weekday() not in workdays:
            last_workday += datetime.timedelta(days=1)
    # print("下一个工作日：", last_workday)
    return last_workday



总资金=150000
预留金额=0
投入仓位=0.8
盈余=0
现值=(总资金-预留金额)*投入仓位+盈余
每月支出=21000
是否保存="Y"
#360
还款金额=34000 #需要修改
天数=10  #需要修改交易日
终值=现值+还款金额+每月支出/20*天数
计划="360(3.4)"  #需要修改
N天之后的记录=7

# #JD
# 还款金额=50000 #需要修改
# 天数=67  #需要修改
# 终值=现值+还款金额+每月支出/20*天数
# 计划="JD(5)"  #需要修改
# N天之后的记录=7+40

# #BD
# 还款金额=150000 #需要修改
# 天数=105  #需要修改
# 终值=现值+还款金额+每月支出/20*天数
# 计划="BD(15)"  #需要修改
# N天之后的记录=7+31+71

last_workday = 获取最近工作日(N天之后的记录)


def 计算N天后的工作日(N):
    # 计算若干天后的工作日
    days = N  # 假设要计算5个工作日后的日期
    next_workday = last_workday
    for i in range(days):
        next_workday += datetime.timedelta(days=1)
        while next_workday.weekday() not in workdays:
            next_workday += datetime.timedelta(days=1)
    return next_workday


日利率 = ((终值) / 现值) ** (1 / 天数) - 1
周利率 = (1 + 日利率) ** 5 - 1
月利率 = (1 + 周利率) ** 4 - 1
突破1点日利率 = ((终值) / 现值) ** (1 / 天数) - 1 + 0.01
突破1点周利率 = (1 + 突破1点日利率) ** 5 - 1
突破1点月利率 = (1 + 突破1点周利率) ** 4 - 1

def 转为百分比(shu):
    return str(round(shu * 100, 2)) + "%"

print(
    f"天数:{天数},终值：{str(round(终值 / 10000, 2))}，(支付：{str(round(每月支出 / 20 * 天数 / 10000, 2))})，(偿还：{round(还款金额 / 10000, 2)}),日利率：{转为百分比(日利率)},周利率：{转为百分比(周利率)},月利率：{转为百分比(月利率)}")
round(终值 / 10000, 2)
列表 = []
for i in range(天数 + 1):
    增长率 = (1 + 日利率) ** i - 1
    终值 = 现值 * (1 + 增长率)
    日期 = 计算N天后的工作日(i)
    记录 = [i, 终值, 转为百分比(增长率), 日期]
    列表.append(记录)
数据 = pd.DataFrame(列表)
数据.columns = ["天数", "终值", "累计增长率", "交易日"]
数据["现值"] = 数据["终值"].shift(1)
df = 数据[["天数", "现值", "终值", "累计增长率", "交易日"]]
开始日期 = df["交易日"].iloc[0]
结束日期 = df["交易日"].iloc[-1]
print(f"开始日期：{开始日期},结束日期“{结束日期}")
文件名 = "【按计划】_"+str(round(现值/10000,2))+"_" + 计划 + "_" + str(天数) + "天_" + str(开始日期) + "&" + str(结束日期) + "_" + "日" + str(
    round(日利率 * 100, 2)) + "%_周" + str(round(周利率 * 100, 2)) + "%_月" + str(round(月利率 * 100, 2)) + "%"
保存路径 = "./" + 文件名 + ".csv"
if 是否保存=="Y":
    df.to_csv(保存路径, index=False)
# print(df)
# print("按计划已保存")

列表 = []
for i in range(天数 + 1):
    突破1点增长率 = (1 + 突破1点日利率) ** i - 1
    突破1点终值 = 现值 * (1 + 突破1点增长率)
    日期 = 计算N天后的工作日(i)
    记录 = [i, 突破1点终值, 转为百分比(突破1点增长率), 日期]
    列表.append(记录)
    if 突破1点终值>终值:
        print(f"{日期}提前完成计划")
        break
数据 = pd.DataFrame(列表)
数据.columns = ["天数", "突破1点终值", "突破1点累计增长率", "交易日"]
数据["现值"] = 数据["突破1点终值"].shift(1)
df = 数据[["天数", "现值", "突破1点终值", "突破1点累计增长率", "交易日"]]
开始日期 = df["交易日"].iloc[0]
结束日期 = df["交易日"].iloc[-1]
# print(f"开始日期：{开始日期},结束日期“{结束日期}")
实际天数=len(数据)
文件名 = "【突破1点】_"+str(round(现值/10000,2))+"_" + 计划 + "_" + str(实际天数) + "天_" + str(开始日期) + "&" + str(结束日期) + "_" + "日" + str(
    round(日利率 * 100, 2)) + "%_周" + str(round(周利率 * 100, 2)) + "%_月" + str(round(月利率 * 100, 2)) + "%"
保存路径 = "./" + 文件名 + ".csv"
if 是否保存=="Y":
    df.to_csv(保存路径, index=False)
实际终值 = df["突破1点终值"].iloc[-1]
print(
    f"突破1点天数:{实际天数},终值：{str(round(实际终值 / 10000, 2))}，(支付：{str(round(每月支出 / 20 * 天数 / 10000, 2))})，(偿还：{round(还款金额 / 10000, 2)})，日利率：{转为百分比(突破1点日利率)},周利率：{转为百分比(突破1点周利率)},月利率：{转为百分比(突破1点月利率)}")

# print(df)
print("已保存")